#include <time.h>
#include <functional>
#include "BlockQueue.hpp"
#include "Task.hpp"

using namespace BlockQueueModule;
using namespace TaskModule;
using task_t = std::function<void()>;

void *Producter(void *args)
{
    BlockQueue<task_t> *bq = reinterpret_cast<BlockQueue<task_t>*>(args);
    bq->Equeue([](){
            std::cout << "hello linux" << std::endl;
        });
    bq->Equeue([](){
            std::cout << "hello world" << std::endl;
        });
    bq->Equeue([](){
            std::cout << "hello C++" << std::endl;
        });

    std::cout << "派发了三个任务" << std:: endl;
    return nullptr;
}

void *Consumer(void *args)
{
    BlockQueue<task_t> *bq = reinterpret_cast<BlockQueue<task_t>*>(args);
    while (true)
    {
        sleep(1);
        task_t t;
        bq->Pop(&t);
        t();
        std::cout << "处理了一个任务" << std::endl;
    }
    return nullptr;
}

int main()
{
    srand(time(nullptr));
    //创建阻塞队列（临界区）
    BlockQueue<task_t> *bq = new BlockQueue<task_t>(5);

    //单生产，单消费
    //创建生产者和消费者线程
    // pthread_t p1, p2, c1, c2, c3;
    pthread_t p, c;
    pthread_create(&p, nullptr, Producter, bq);
    pthread_create(&c, nullptr, Consumer, bq);

    pthread_join(p, nullptr);
    pthread_join(c, nullptr);
    // pthread_create(&p1, nullptr, Producter, bq);
    // pthread_create(&p2, nullptr, Producter, bq);
    // pthread_create(&c1, nullptr, Consumer, bq);
    // pthread_create(&c2, nullptr, Consumer, bq);
    // pthread_create(&c3, nullptr, Consumer, bq);

    // pthread_join(p1, nullptr);
    // pthread_join(p2, nullptr);
    // pthread_join(c1, nullptr);
    // pthread_join(c2, nullptr);
    // pthread_join(c3, nullptr);

    delete bq;
    return 0;
}


// #include <time.h>
// #include "BlockQueue.hpp"
// #include "Task.hpp"

// using namespace BlockQueueModule;
// using namespace TaskModule;

// void *Producter(void *args)
// {
//     BlockQueue<Task> *bq = reinterpret_cast<BlockQueue<Task>*>(args);
//     while (true)
//     {
//         sleep(1);
//         int x = rand() % 10 + 1;
//         int y = rand() % 30 + 1;
//         Task t(x, y);
//         bq->Equeue(t);
//         std::cout << "派发了一个任务" << std:: endl;
//         printf("%d + %d = ?\n", x, y);
//     }
//     return nullptr;
// }

// void *Consumer(void *args)
// {
//     BlockQueue<Task> *bq = reinterpret_cast<BlockQueue<Task>*>(args);
//     while (true)
//     {
//         Task t;
//         bq->Pop(&t);
//         t.Excute();
//         printf("%d + %d = %d\n", t.X(), t.Y(), t.Result());
//         std::cout << "处理了一个任务" << std::endl;
//     }
//     return nullptr;
// }

// int main()
// {
//     srand(time(nullptr));
//     //创建阻塞队列（临界区）
//     BlockQueue<Task> *bq = new BlockQueue<Task>(5);

//     //单生产，单消费
//     //创建生产者和消费者线程
//     // pthread_t p1, p2, c1, c2, c3;
//     pthread_t p, c;
//     pthread_create(&p, nullptr, Producter, bq);
//     pthread_create(&c, nullptr, Consumer, bq);

//     pthread_join(p, nullptr);
//     pthread_join(c, nullptr);
//     // pthread_create(&p1, nullptr, Producter, bq);
//     // pthread_create(&p2, nullptr, Producter, bq);
//     // pthread_create(&c1, nullptr, Consumer, bq);
//     // pthread_create(&c2, nullptr, Consumer, bq);
//     // pthread_create(&c3, nullptr, Consumer, bq);

//     // pthread_join(p1, nullptr);
//     // pthread_join(p2, nullptr);
//     // pthread_join(c1, nullptr);
//     // pthread_join(c2, nullptr);
//     // pthread_join(c3, nullptr);

//     delete bq;
//     return 0;
// }


 